package KontrolLag;

import java.util.ArrayList;
import java.util.Calendar;

import DBLag.*;
import ModelLag.*;

public class IndlaeggelsesCtr {
	private PersonCtr personCtr;
	private HandlingsCtr handlingsCtr;
	private DbGetMax gMax;
	private DbIndlaeggelse Dbindlaeggelse;

	public IndlaeggelsesCtr() {
		personCtr = new PersonCtr();
		handlingsCtr = new HandlingsCtr();
		gMax = new DbGetMax();
		Dbindlaeggelse = new DbIndlaeggelse();

	}

	public Indlaeggelse opretIndlaeggelse(String Navn, String Addresse,
			String TlfNr, int PostNr, String by, boolean Tvang, boolean Udgang,
			boolean Voldsrisiko, boolean Selvmordsrisiko,
			String IndlaeggelsesDato, String IndlaeggelsesTidspunkt, Person medarbejder) {

		Indlaeggelse i = new Indlaeggelse();
		i.setiId(gMax.getMaxIndlaeggelsesId() + 1);
		Person p = personCtr.opretPatient(Navn, Addresse, TlfNr, PostNr, by,
				Tvang, Udgang, Voldsrisiko, Selvmordsrisiko);
		i.setPatient(p);
		i.setIndlaeggelsesDato(IndlaeggelsesDato);
		i.setIndlaeggelsesTidspunkt(IndlaeggelsesTidspunkt);
		i.setMedarbejder(medarbejder);
		Dbindlaeggelse.tilfoejIndlaeggelse(i);
		
		Handling g = handlingsCtr.opretGafScore(i);
		g.setUdloebsDato(samletUdloebsDato(i, 1));
		g.setUdloebsTidspunkt(samletUdloebsTidspunkt(i));
		i.tilfoejGafScore(g);
		handlingsCtr.opdaterGafScore(g);

		Handling b = handlingsCtr.opretBehPlan(i);
		b.setUdloebsDato(samletUdloebsDato(i, 1));
		b.setUdloebsTidspunkt(samletUdloebsTidspunkt(i));
		i.tilfoejBehPlan(b);
		handlingsCtr.opdaterBehPlan(b);

		Handling b1 = handlingsCtr.opretBehPlan(i);
		b1.setUdloebsDato(samletUdloebsDato(i, 8));
		b1.setUdloebsTidspunkt(samletUdloebsTidspunkt(i));
		i.tilfoejBehPlan(b1);
		handlingsCtr.opdaterBehPlan(b1);

		return i;
	}

	public void sletIndlaeggelse(Indlaeggelse i) {
		for (Handling b : i.getBehPlaner()) {
			handlingsCtr.sletBehPlan(b.gethId());
		}

		for (Handling g : i.getGafScores()) {
			handlingsCtr.sletGafScore(g.gethId());
		}

		for (Handling e : i.getEfterSamtaler()) {
			handlingsCtr.sletEfterSamtale(e.gethId());
		}
		Dbindlaeggelse.sletIndlaeggelse(i.getiId());
		personCtr.sletPatient(i.getPatient().getpId());

	}

	public Indlaeggelse findIndlaeggelse(Indlaeggelse i) {
		Indlaeggelse Ie = Dbindlaeggelse.findIndlaeggelse(i.getiId());
		return Ie;
	}

	public ArrayList<Indlaeggelse> alleIndlaeggelser() 
	{
		ArrayList<Indlaeggelse> indlaeggelser = new ArrayList<Indlaeggelse>();
		if(Dbindlaeggelse.listAlleIndlaeggelser() != null || Dbindlaeggelse.listAlleIndlaeggelser().size() != 0)
		{
			for(Indlaeggelse i :  Dbindlaeggelse.listAlleIndlaeggelser())
			{
				handlingsCtr.tilfoejHandlingerPaaIndlaeggelse(i);
				indlaeggelser.add(i);
			}
		}

		return indlaeggelser;

	}

	public void opdaterIndlaeggelse(Indlaeggelse i) {
		personCtr.opdaterPatient(i.getPatient());
		if(i.getMedarbejder() != null)
		{
			personCtr.opdaterMedarbejder(i.getPatient());
		}
		for(Handling b : i.getBehPlaner())
		{
			handlingsCtr.opdaterBehPlan(b);
		}
		for(Handling e : i.getEfterSamtaler())
		{
			handlingsCtr.opdaterEfterSamtale(e);
		}
		for(Handling g : i.getGafScores())
		{
			handlingsCtr.opdaterGafScore(g);
		}
	}

	private String samletUdloebsDato(Indlaeggelse i, int dage) {
		Calendar c = Calendar.getInstance();
		c.set(udloebsDatoaar(i), udloebsDatoMaanede(i), udloebsDatoDag(i),
				udloebsTime(i), udloebsMin(i));
		c.add(c.DAY_OF_MONTH, dage);
		String dato = Integer.toString(c.get(c.DAY_OF_MONTH)) + "/"
				+ Integer.toString(c.get(c.MONTH)) + "-"
				+ Integer.toString(c.get(c.YEAR));
		return dato;

	}

	private String samletUdloebsTidspunkt(Indlaeggelse i) {
		Calendar c = Calendar.getInstance();
		c.set(udloebsDatoaar(i), udloebsDatoMaanede(i), udloebsDatoDag(i),
				udloebsTime(i), udloebsMin(i));
		String tidspunkt = Integer.toString(c.get(c.HOUR_OF_DAY)) + ":"
				+ Integer.toString(c.get(c.MINUTE));
		return tidspunkt;

	}

	private int udloebsDatoDag(Indlaeggelse i) {
		int index = 0;
		String datoDag = "";
		boolean foundDatoDag = false;
		while (!foundDatoDag) {
			String currentCharacter = i.getIndlaeggelsesDato().trim()
					.substring(index, index + 1);
			if (currentCharacter.matches("/")) {
				foundDatoDag = true;
			} else {
				datoDag += currentCharacter;
				index++;
			}

		}

		return Integer.parseInt(datoDag);

	}

	private int udloebsDatoMaanede(Indlaeggelse i) {
		int index = 0;
		int index2 = 0;
		String datoMaanede = "";
		boolean foundDatoMaanede = false;
		boolean found = false;
		while (!found) {
			String currentCharacter = i.getIndlaeggelsesDato().trim()
					.substring(index, index + 1);
			if (currentCharacter.matches("/")) {
				foundDatoMaanede = true;
				index2 = index;
				index2++;
			} else {
				index++;
			}
			while (foundDatoMaanede) {
				String currentCharacter1 = i.getIndlaeggelsesDato().trim()
						.substring(index2, index2 + 1);
				if (currentCharacter1.matches("-")) {
					found = true;
					foundDatoMaanede = false;

				} else {
					datoMaanede += currentCharacter1;
					index2++;
				}
			}

		}

		return Integer.parseInt(datoMaanede);

	}

	private int udloebsDatoaar(Indlaeggelse i) {
		String dato;
		int index = 0;
		boolean found = false;
		while (!found) {
			String currentCharacter = i.getIndlaeggelsesDato().trim()
					.substring(index, index + 1);
			if (currentCharacter.matches("-")) {
				found = true;

			} else {
				index++;
			}
		}
		dato = i.getIndlaeggelsesDato().trim().substring(index + 1);
		return Integer.parseInt(dato);
	}

	private int udloebsTime(Indlaeggelse i) {
		int index = 0;
		String datoTime = "";
		boolean foundDatoTime = false;
		while (!foundDatoTime) {
			String currentCharacter = i.getIndlaeggelsesTidspunkt().trim()
					.substring(index, index + 1);
			if (currentCharacter.matches(":")) {
				foundDatoTime = true;
			} else {
				datoTime += currentCharacter;
				index++;
			}

		}

		return Integer.parseInt(datoTime);

	}

	private int udloebsMin(Indlaeggelse i) {
		String datoMinut;
		int index = 0;
		boolean found = false;
		while (!found) {
			String currentCharacter = i.getIndlaeggelsesTidspunkt().trim()
					.substring(index, index + 1);
			if (currentCharacter.matches(":")) {
				found = true;

			} else {
				index++;
			}
		}
		datoMinut = i.getIndlaeggelsesTidspunkt().trim().substring(index + 1);
		return Integer.parseInt(datoMinut);
	}

}
